/**
 * 
 * UDP:
 *  Sending indepented packats of data, called datagrams from one computer to other computer.
 *  It not quaranted the arriavel and sequencing.
 *  Example: ping
 * 
 * DATAGRAM : Ağ üzerinden gönderimi yapılan bağımsız mesaj; datagram aşağıdakileri garanti etmez;
 *              * Mesajın ulaşmasını
 *              * Mesajın ulaşma zamanını
 *              * İçeriğini
 */
package UDP_Server_Client;

import java.io.*;
/* Kullanıcıdan veri gönderip, almak için javanın i/o sınıflarını kullanıyoruz */
import java.net.*;
/* Datagram (paket) için soket yaratmak için javanın sınıflarını kullanıyoruz */

/**
 *
 * @author necmeddin
 * @version 1.0
 */
public class UDPClient {
    
    public static void main(String[] args){

        String serverHostname = new String ("127.0.0.1");        
        
        try {
    
            // Client soket oluşturuluyor...
            DatagramSocket clientSocket = new DatagramSocket(); 
  
            InetAddress IPAddress = InetAddress.getByName(serverHostname); 
            System.out.println (IPAddress + "adresindeki sunucuya 9876 numaralı port ile bağlantı kuruluyor.");
  
            byte[] sendData     = new byte[1024]; 
            byte[] receiveData  = new byte[1024]; 

            BufferedReader userMessage = new BufferedReader(new InputStreamReader(System.in)); 
            System.out.print("Gönderilecek mesaj gir: ");
            String sentence = userMessage.readLine(); 
            sendData = sentence.getBytes();         

            System.out.println ("Sunucuya " + sendData.length +" bytes mesaj gönderiliyor");
            
            // Sunucuya mesajı gönder.
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); 
            clientSocket.send(sendPacket); 
  
            // Sunucudan mesaj alınıyor.
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
            System.out.println ("Sunucudan cevap bekleniyor 10 saniye cevap süresi var.");
            clientSocket.setSoTimeout(10000);

            try {
                
                clientSocket.receive(receivePacket); 
                String modifiedSentence = new String(receivePacket.getData()); 

                 InetAddress returnIPAddress = receivePacket.getAddress();
                 int port = receivePacket.getPort();

                 System.out.println ("Sunucu : " + returnIPAddress + " Port :" + port);
                 System.out.println("Gelen Mesaj : " + modifiedSentence); 

                }
            catch (SocketTimeoutException e)
                {
                 System.out.println ("Timeout Occurred: Packet assumed lost : "+e);
            }
            clientSocket.close(); 
           }
         catch (Exception e) { 
           System.out.println("Hatalı şeyler olduğu konuşuluyor, muhtemelen şöyle şeyler "+e);
          }
    }
}
